// EAN8.js - EAN-8 条码实现（8位数字）
// 自动计算/验证校验码，支持7位输入自动补全
// 参考：http://www.barcodeisland.com/ean8.phtml

import EAN from './EAN.js';

/**
 * 计算 EAN-8 校验码
 * 规则：奇数位 ×3，偶数位 ×1（从左到右，第1位为奇数）
 * @param {string} number - 前7位数字
 * @returns {number} 校验码（0-9）
 */
function checksum(number) {
	const sum = number
		.substr(0, 7)
		.split('')
		.map(n => parseInt(n, 10))
		.reduce((total, digit, index) => {
			return index % 2 === 0 ? total + digit * 3 : total + digit; // 奇数位×3，偶数位×1
		}, 0);

	return (10 - (sum % 10)) % 10;
}

export class EAN8 extends EAN {
	constructor(data, options) {
		// 如果是7位数字，自动补上校验码
		if (/^[0-9]{7}$/.test(data)) {
			data += checksum(data);
		}

		super(data, options);
	}

	/**
	 * 验证 EAN-8 是否有效
	 * 1. 必须是8位数字
	 * 2. 最后一位必须等于 checksum(前7位)
	 * @returns {boolean}
	 */
	valid() {
		return (
			/^[0-9]{8}$/.test(this.data) &&
			parseInt(this.data[7], 10) === checksum(this.data)
		);
	}

	/**
	 * 获取左侧文本（前4位）
	 * @returns {string}
	 */
	leftText() {
		return super.leftText(0, 4);
	}

	/**
	 * 编码左侧4位（使用 LLLLLLLL 编码表）
	 * @returns {string} 二进制条码
	 */
	leftEncode() {
		const data = this.data.substr(0, 4);
		return super.leftEncode(data, 'LLLL');
	}

	/**
	 * 获取右侧文本（后4位）
	 * @returns {string}
	 */
	rightText() {
		return super.rightText(4, 4);
	}

	/**
	 * 编码右侧4位（使用 R 编码表）
	 * @returns {string} 二进制条码
	 */
	rightEncode() {
		const data = this.data.substr(4, 4);
		return super.rightEncode(data, 'RRRR');
	}
}
